﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    变步长Treanor方法
    t积分起始点。
    h积分步长。
    n一阶微分方程组中方程个数，也是未知函数个数。
    y[n]存放n个未知函数在起始点t处的函数值。返回n个未知函数在t+h处的函数值。
    eps控制精度要求。
    f计算微分方程组中各方程右端函数值的函数名。
    */

    public static unsafe string drive_treanor()
    {
        int j;
        double t, h, eps;
        double[] y = new double[3];

        y[0] = 1.0; y[1] = 0.0; y[2] = -1.0;
        t = 0.0;
        h = 0.001;
        eps = 0.0000001;
        gl.f_x_ya_n_da = tnrf;

        string rs = "";
        rs += gl.html_table("变步长Treanor方法，函数（t=" + t + "）处的函数值", y);

        for (j = 1; j <= 10; j++)
        {
            gl.treanor(t, h, 3, y, eps);
            rs += gl.html_table("函数（t=" + t + "）处的函数值", y);
            t = t + h;
        }
        return rs;
    }

    // 计算微分方程组中各方程右端函数值	
    private static unsafe void tnrf(double t, double* y, int n, double* d)
    {
        //t=t; n=n;
        d[0] = -21.0 * y[0] + 19.0 * y[1] - 20.0 * y[2];
        d[1] = 19.0 * y[0] - 21.0 * y[1] + 20.0 * y[2];
        d[2] = 40.0 * y[0] - 40.0 * y[1] - 40.0 * y[2];
        return;
    }
}